ديف أوبس

نشر تطبيقات PHP باستخدام Ansible

كيفية نشر تطبيقات PHP متعددة باستخدام Ansible على Ubuntu: الدليل الشامل لإدارة النشر الآلي

الكلمات المفتاحية:

Ansible, نشر التطبيقات, Ubuntu, PHP, DevOps, الأتمتة, خوادم متعددة, إعداد السيرفرات, التهيئة التلقائية, LAMP, Playbook, SSH, CI/CD


مقدمة

في بيئات التطوير الحديثة التي تعتمد على فلسفة DevOps، أصبحت أتمتة النشر وصيانة التطبيقات ضرورة أساسية لضمان الأداء المستقر والتوسع السلس. وبالنسبة للمطورين الذين يعملون باستخدام لغة PHP، قد يكون من الشائع تشغيل تطبيقات متعددة على نفس الخادم أو عبر خوادم Ubuntu مختلفة.

هنا يظهر دور Ansible كأداة قوية ومفتوحة المصدر تتيح إمكانية تنفيذ عمليات معقدة مثل التهيئة، التثبيت، التكوين، ونشر التطبيقات عبر شبكات خوادم متعددة بشكل متسق وآمن.

هذا المقال يقدم دليلاً عملياً مفصلاً عن كيفية استخدام Ansible لنشر تطبيقات PHP متعددة على نظام Ubuntu. سيغطي المقال إعداد البيئة، كتابة ملفات Playbook، إدارة الأدوار، التعامل مع قواعد البيانات، إعداد Apache/Nginx، والتعامل مع الحزم والاعتمادات الخاصة بكل تطبيق.


أولاً: لمحة عن Ansible

Ansible هو إطار عمل يعتمد على لغة YAML لتنفيذ عمليات إدارة الأنظمة عن بعد. يستخدم بروتوكول SSH للتواصل مع الخوادم، مما يجعله سهل الاستخدام ولا يتطلب تثبيت أي عميل على الطرف الآخر.

من مميزاته:

  • لا يحتاج إلى عميل Agent

  • يستخدم لغة YAML لكتابة Playbooks

  • يدعم إدارة التكوين والتحديث والنشر

  • يمكن استخدامه على أي نظام Unix-like


ثانياً: تحضير بيئة العمل

1. تثبيت Ansible

يجب أولاً تثبيت Ansible على الجهاز الذي سيكون بمثابة “المايسترو” الذي يدير عمليات النشر.

bash
sudo apt update sudo apt install ansible -y

2. تهيئة ملف الجرد (Inventory File)

في Ansible، يُستخدم ملف الجرد لتعريف الخوادم الهدف التي سيتم تنفيذ المهام عليها.

ini
[webservers] 192.168.1.100 ansible_user=ubuntu 192.168.1.101 ansible_user=ubuntu

3. إعداد الوصول عبر SSH

يجب تفعيل الوصول بدون كلمة مرور عبر SSH لضمان التنفيذ التلقائي.

bash
ssh-keygen -t rsa ssh-copy-id [email protected] ssh-copy-id [email protected]

ثالثاً: هيكلة المشروع

يوصى باستخدام الهيكل القياسي لمشاريع Ansible لتسهيل الصيانة والتنظيم. المثال التالي يوضح بنية المجلدات:

css
multi-php-deploy/ ├── ansible.cfg ├── inventory ├── playbooks/ │ ├── main.yml │ ├── app1.yml │ └── app2.yml ├── roles/ │ ├── common/ │ ├── apache/ │ ├── php/ │ ├── mysql/ │ └── app1/ │ └── tasks/ │ └── main.yml

رابعاً: إنشاء Playbook رئيسي

ملف main.yml

yaml
- hosts: webservers become: true roles: - common - apache - php - mysql - { role: app1, tags: ['app1'] } - { role: app2, tags: ['app2'] }

خامساً: إعداد الأدوار Roles

1. دور common

المسؤول عن المهام العامة مثل التحديث وتثبيت الأدوات الأساسية.

yaml
# roles/common/tasks/main.yml - name: تحديث النظام apt: update_cache: yes upgrade: dist - name: تثبيت أدوات النظام الأساسية apt: name: ['git', 'curl', 'zip', 'unzip'] state: present

2. دور Apache

yaml
# roles/apache/tasks/main.yml - name: تثبيت Apache apt: name: apache2 state: present - name: تفعيل mod_rewrite apache2_module: name: rewrite state: present - name: التأكد من تشغيل Apache service: name: apache2 state: started enabled: true

3. دور PHP

yaml
# roles/php/tasks/main.yml - name: تثبيت PHP والحزم الأساسية apt: name: - php - php-mysql - php-cli - php-curl - libapache2-mod-php state: present

4. دور MySQL

yaml
# roles/mysql/tasks/main.yml - name: تثبيت MySQL apt: name: mysql-server state: present - name: تأمين MySQL shell: | mysql_secure_installation < args: executable: /bin/bash

سادساً: إعداد تطبيقات PHP

1. إعداد تطبيق App1

yaml
# roles/app1/tasks/main.yml - name: نسخ ملفات التطبيق إلى الخادم copy: src: /local/path/app1/ dest: /var/www/app1/ owner: www-data group: www-data mode: '0755' - name: إعداد ملف vhost لـ Apache template: src: app1.conf.j2 dest: /etc/apache2/sites-available/app1.conf - name: تفعيل الموقع shell: | a2ensite app1.conf systemctl reload apache2

2. قالب vhost (Jinja2 Template)

apache
ServerName app1.example.com DocumentRoot /var/www/app1 AllowOverride All Require all granted ErrorLog ${APACHE_LOG_DIR}/app1_error.log CustomLog ${APACHE_LOG_DIR}/app1_access.log combined

سابعاً: تشغيل الـ Playbook

لتنفيذ عملية النشر:

bash
ansible-playbook -i inventory playbooks/main.yml --tags "app1"

يمكن تنفيذ نشر التطبيق الثاني عبر:

bash
ansible-playbook -i inventory playbooks/main.yml --tags "app2"

ثامناً: التعامل مع بيئات متعددة

مثال على جرد خوادم staging و production

ini
[staging] staging1.example.com [production] prod1.example.com prod2.example.com

يمكن في الـ Playbook استخدام شرط لتمييز البيئة عبر متغير:

yaml
- hosts: all vars: app_env: "{{ group_names[0] }}"

تاسعاً: دمج مع CI/CD

يمكن تشغيل Ansible كجزء من خط أنابيب CI/CD في أدوات مثل GitLab CI أو Jenkins.

مثال GitLab CI:

yaml
deploy_staging: script: - ansible-playbook -i inventory playbooks/main.yml --tags "app1" --limit staging

عاشراً: إدارة الإصدارات والتحديثات

لضمان إمكانية التراجع rollback، يمكن اتباع تقنيات مثل:

  • نسخ احتياطي للملفات القديمة قبل النشر

  • استخدام Git لتتبع إصدار كل تطبيق

  • حفظ النسخ السابقة من إعدادات Apache وملفات PHP


جدول: مقارنة بين طرق النشر اليدوي والنشر باستخدام Ansible

المعيار النشر اليدوي Ansible
الأتمتة
قابلية التكرار منخفضة عالية
التوسّع إلى خوادم متعددة صعب سهل وسريع
إدارة الإعدادات غير مركزية مركزية باستخدام ملفات YAML
التتبع والتحقق يتطلب توثيق يدوي ممكن عبر Git وملفات Playbook
الأمان يعتمد على المستخدم مبني على SSH وممارسات أمان قوية

الخاتمة

يُعد Ansible أداة محورية في تنفيذ عمليات نشر آمنة وقابلة للتوسعة لتطبيقات PHP متعددة على Ubuntu. من خلال الاعتماد على هيكلة مرنة وأدوار متخصصة، يمكن لأي فريق تطوير تبسيط الإجراءات المعقدة وتحقيق استقرار في بيئة الإنتاج. في ظل تصاعد تعقيد البنية التحتية، يصبح الأتمتة عبر Ansible ضرورة أكثر من كونها اختيارًا.


المراجع: